// node api -> 框架层
// react 前端 MVVM 模式的项目 Model View ViewModel
// 后端 模式？ MVC Model(数据模型，model) View(html) Controller(控制器)
// M V 不能直接通信 中间由 C 来管理 业务加工、数据处理控制

const Koa = require('koa'); // npm i koa
const app = new Koa(); // web server   server app
// koa 是最好的node后端框架，遵守mvc开发范式

const path = require('path'); // 内置模块

// 使用中间件，注意有先后顺序

// 支持静态服务的中间件
const staticServer = require('koa-static');

// 会话服务中间件 session
const koaSession = require('koa-session')
const session_signed_key = ["secret"]; // key
app.keys = session_signed_key;
const session_config = {
    key: 'koa:sess', /**  cookie的key。 (默认是 koa:sess) */
    maxAge: 1000 * 60,   /**  session 过期时间，以毫秒ms为单位计算 。*/
    autoCommit: true, /** 自动提交到响应头。(默认是 true) */
    overwrite: true, /** 是否允许重写 。(默认是 true) */
    httpOnly: true, /** 是否设置HttpOnly，如果在Cookie中设置了"HttpOnly"属性，那么通过程序(JS脚本、Applet等)将无法读取到Cookie信息，这样能有效的防止XSS攻击。  (默认 true) */
    signed: true, /** 是否签名。(默认是 true) */
    rolling: true, /** 是否每次响应时刷新Session的有效期。(默认是 false) */
};
const session = koaSession(session_config, app)

app.use(session);

// app.use() 函数 启用一个中间件 applyMiddleware
// 就像是 redux compose

// staticServer 静态文件服务器 js css img file 服务器内部缓存
app.use(staticServer(path.join(__dirname, '/static')))
// post/:id 路由 怎么找，静态资源找不到，给下一个中间件
// 中间件是有顺序的，上一个不行，去下一个

// ctx = req + res 上下文环境
app.use(async ctx => {
    // 支持异步,动态数据响应
    // 数据库的查询
    // await db.find()
    // 端口跳转
    // ctx.path: /login
    // ctx.url: /login?userName=test&password=test
    if (ctx.path == '/login') {
        // 登录
        const { userName, password } = ctx.query;
        // console.log(userName, password)
        if (userName == 'test' && password == 'test') {
            // 作为 cookie 种 session，给后端取数据
            ctx.session.login =
            {
                name: userName,
                uid: 2,
                sex: '男',
                level: 2
            }
            ctx.type = 'html' // 响应头 格式
            ctx.body = `
              登录成功
              <a href="/testlogin">去测试登录</a>
              `;
        }
    } else if (ctx.path == '/testlogin') {
        console.log(ctx.session, '/////');
        if (!ctx.session.login.name) {
            // 不存在login.name 跳转到登录页
            ctx.redirect('/');
        }
        else {
            ctx.body = '已经登录' + ctx.session.login.name;
        }
    }

    // 后端中一个 uid cookie
    // ctx.cookies.set('uid', '122333333', {
    //     path: '/admin',
    //     maxAge: 1000 * 60 * 10,
    //     // httpOnly: false 时 设置 前端js是可以拿到cookie document.cookie -> 'uid=122333333'
    //     httpOnly: true, // true 时 不能被前端获取
    // })
    // domain+path 限制cookie生效位置

    // 最后一条代码 执行后终止
    // ctx.body = `Hello World !`
})
app.listen(1314);